package com.zhouheng.springbootmultithreading.tuling.jmm;

/**
 * 缓存锁定
 * CPU缓存一致性协议——MESI
 * M：修改
 * E：独享
 * S：共享
 * I：失效
 * 如果A,B线程同时读取值，且A计算完还没会回写时，
 * 1.B也计算完了，A此时回写，但B因为是失效状态不会回写，最终结果就是A计算的结果
 * 2.B还没开始计算，A此时回写，此时B发现变量已经失效了，会重新去内存中去拿变量值来开始计算，最终结果就是A和B都计算的正确的结果
 *
 * @author  Fox
 */
public class Test {

    private volatile static int sum = 0;
    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(()->{
                for (int j = 0; j < 10000; j++) {
                    sum++;
                }
            });
            thread.start();
        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        /**
         * volatile不能保证原子性，最终计算结果会丢失部分，值会比预期结果10万小很多，输出是3万不到
         */
        System.out.println("sum=" + sum);

    }

}
